# encoding = utf-8
import functools
import json
"""
装饰器嵌套使用的一些理解：
在使用到loga、logb、logc三个注解时，logc首先会把传入的函数封装，在使用函数func时，实际上是执行logc中的wrapper（）函数；
logb把logc的wrapper（）函数作为基本函数，进行封装，实际上程序执行logb中的wrapper（）；
同理loga把logb的函数wrapper（）作为封装对象进行封装，执行loga中的wrapper（）函数。
所以，最终执行函数tt()时，首先执行最外层的loga中的wrapper（）函数，打印aaa；
然后执行loga的wrapper中的fun（），也就是logb中的wrapper（）函数，打印bbb；
再执行logb中的wrapper中的fun（），也就是logc中的wrapper（）函数，打印ccc；
最后执行log中的wrapper中的fun（）从，也就是最开始被封装的tt()函数。c
"""

"""
测试注解样例
"""
def loga(fun):
    @functools.wraps(fun)
    def wrapper(*args,**kwargs):
        print('aaacall %s():' % fun.__name__)
        print(*args)
        # print(**kwargs)
        return fun(*args, **kwargs)
    return wrapper
def logb(fun):
    @functools.wraps(fun)
    def wrapper(*args,**kwargs):
        print('bbbcall %s():' % fun.__name__)
        print(*args)
        # print(**kwargs)
        return fun(*args, **kwargs)
    return wrapper
def logc(fun):
    @functools.wraps(fun)
    def wrapper(*args,**kwargs):
        print('ccccall %s():' % fun.__name__)
        print(*args)
        # print(**kwargs)
        return fun(*args, **kwargs)
    return wrapper





def json_response(fun):
    @functools.wraps(fun)
    def wrapper(*args,**kwargs):
        res_data = fun(*args,**kwargs)
        if isinstance(res_data,dict):
            if 'success' not in res_data:
                res_data = dict(success=True,data=res_data)
        elif isinstance(res_data,(int, float, str, list)):
            return dict(success=True,data=res_data)
        else:
            raise TypeError('response should be instance of dict.')
        return json.dumps(res_data)
    return wrapper

